home *** CD-ROM | disk | FTP | other *** search
- ' ZFormat©, 1991 Lininger Technology
-
- ' Written and Designed by
-
- ' Michael K. Lininger
- ' Lininger Technology
- ' 385 Bowling Green Place
- ' Gahanna, Ohio 43230
-
- ' Dec 07, 1991 Version 1.0
-
- ' INTERNET: <Mike.Lininger@P21.F20.N226.Z1.FIDONET.ORG>
- ' INTERNET: Mike.Lininger@cmhgate.fidonet.org
- ' AOL: Michael86
- ' FIDONET: 1:226/20.21
- ' FIDONET: 1:322/115.6
-
- ' ZBasic 5.x Settings
- ' Optimize Expressions as Integer (ON)
- ' Space Required after Keywords (ON)
- ' Default Variable Type (INTEGER)
-
-
-
-
-
- DEF OPEN = "TEXTZBAS" :' Make sure reformated file is saved as a ZBASIC TYPE
- BUNDLE = 1
- WINDOW OFF:COORDINATE WINDOW
- DEF MOUSE = -1:CURSOR 4:WIDTH -2
- temp& = FN MAXMEM :' Purge leftover code
-
- DIM cursor%(50) :' Storage Area for acur resource
- DIM T,L,B,R :' Generic rectangles
- DIM My,Mx,GlobalY,GlobalX,LocalY,LocalX :' Mouse points
- DIM HighHook&,CaretHook& :' Assembly language hooks
-
- ' SFPPUT and SFPGET Record Structures
- DIM SFGoodrCopy
- DIM SFType&
- DIM SFvRefNum
- DIM SFversion
- DIM 63 SFfName$
- DIM whereY,whereX
- DIM 255 prompt$
- DIM 63 origName$
- DIM numTypes
- DIM fltrTp0&,fltrTp1&,fltrTp2&,fltrTp3&
-
- DIM 255 PBlock$ :' Parameter Block Variable
- DIM ScrnT,ScrnL,ScrnB,ScrnR :' Rect of main screen
-
- ' Record Structure for FN SYSENVIRONS()
- DIM EnvVersion,MachineType,SystemVersion,Processor
- DIM HasFPU,KeyBoardType,AtDrvrVersNum,SysVRefNum
-
- DIM KeyRecord(7) :' Record structure for keyboard map
-
- ' Check to see if we are working in the Environment or with a true application
- PHndl& = FN GETRESOURCE(CVI("zFLT"),0)
- LONG IF PHndl& = 0
- ResRef = FN OPENRESFILE("ZFormat.res") :' We are in the Environment, use resource file
- XELSE
- ' We are working with an application, use its resources
- ' Find the real name of our application
- CurApName = &H910
- CurApName$ = ""
- FOR I% = 1 TO PEEK(CurApName)
- CurApName$ = CurApName$ + CHR$(PEEK(CurApName+I%))
- NEXT I%
- ResRef = FN OPENRESFILE(CurApName$) : ' Open the file, if we write rscs back out
- END IF
- IF PHndl& <> 0 THEN CALL RELEASERESOURCE(PHndl&) :' Close loose Handle
- Errnum% = FN RESERROR :' Flush any Resource Errors Values
-
- DEFSTR LONG
-
- ' Store Important ZBasic Registers to use as a base line for MACHine Patches
- POKE LONG &A78,REGISTER(A5)
- POKE LONG &A7C,REGISTER(A6)
-
- dlogHook& = LINE "Dialog_Hook"
-
- SysVolRef = PEEK WORD(528) :' This is VolRef for inside the system folder
-
- LONG FN OptionDown :' Returns True(-1) if option key is down
- CALL GETKEYS(KeyRecord(0))
- END FN=FN BITTST(VARPTR(KeyRecord(3)),13)
-
-
- LONG FN ColorMode
-
- ' Function to determine if this is a color machine and what color depth
-
- ' ROM85 = &H028E
- ' RomTypeW& = -1 FOR 128K OR 512K
- ' RomTypeW& = 32767 FOR PLUS OR SE
- ' RomTypeW& = 16383 FOR ][
-
- ROM85& = &H028E
- RomTypeW& = PEEK WORD(ROM85&)
-
- ' TheGDevice = &H0CC8
- ' gdMode& = 128 FOR 2 B&W OR COLORS
- ' gdMode& = 129 FOR 4 B&W OR COLORS
- ' gdMode& = 130 FOR 16 B&W OR COLORS
- ' gdMode& = 131 FOR 256 B&W OR COLORS
-
- TheGDevice&=&H0CC8
- GDHandle&=PEEK LONG(TheGDevice&)
- GDPtr&=PEEK LONG(GDHandle&)
- gdMode&=PEEK LONG(GDPtr&+42)
-
- ' GET THE B&W/COLOR MODE
-
- IF gdMode& = 128 THEN ColorMode% = 2
- IF gdMode& = 129 THEN ColorMode% = 4
- IF gdMode& = 130 THEN ColorMode% = 16
- IF gdMode& = 131 THEN ColorMode% = 256
- IF RomTypeW& <>16383 THEN ColorMode% = 2
-
- LONG IF (HasFPU AND 1) AND (ColorMode% > 2)
- ColorQD = ColorMode% :' We have color
- XELSE
- ColorQD = 0 :' Color is not present
- END IF
-
- END FN = ColorQD
-
-
- LONG FN CursorShow(standardCur%) :' Check to see if color is available
- LONG IF FN ColorMode > 2 :' Check to see if color is available
- CCrsrHandle& = FN GETCCURSOR(standardCur%) :' Get handle to color cursor resource
- LONG IF CCrsrHandle& > 0 :' If color cursor resource found use it
- CALL SETCCURSOR(CCrsrHandle&) :' Display color cursor CCrsrHandle&
- CALL DISPOSCCURSOR(CCrsrHandle&) :' Dispose of the handle CCrsrHandle&
- XELSE
- CURSOR standardCur% :' Display normal B/W cursor
- END IF
- XELSE
- CURSOR standardCur% :' No Color, display normal B/W cursor
- END IF
- END FN
-
-
- LONG FN CursorSpin
-
- ' This function animates the cursor, when you are within loops for for/next events
- ' Cur% is the offset with the acur that points to the next cursor in the animation sequence
- ' cursor%(0) is the Number of "Frames" cursors of the acur resource
- ' cursor%(1) is the 'used a "Frame' Counter of the acur resource
- ' cursor%(2,4,6,8...) *even #'ed positions are actual cursor resource numbers
- ' cursor%(3,5,7,9...) *odd #'ed postions are not used, buffered area for acur resource
-
- LONG IF cursor_Delay% > cursor%(1) :' only animate cursor if our delay is > than
- cursor_Delay% = 0 :' Reset our delay counter to 0
- Cur% = Cur% + 2 :' Odd numbers are no good so we inc+ by 2
- LONG IF Cur% > cursor%(0) * 2 :' Check to see if beyond Max Frames
- Cur% = 2 :' Reset to beginning frame cursor%(2)
- END IF
- LONG IF FN ColorMode > 2
- CCrsrHandle& = FN GETCCURSOR(cursor%(Cur%)) :' Get handle to color cursor resource
- LONG IF CCrsrHandle& > 0 :' If color cursor resource found use it
- CALL SETCCURSOR(CCrsrHandle&) :' Display color cursor CCrsrHandle&
- CALL DISPOSCCURSOR(CCrsrHandle&) :' Dispose of the handle CCrsrHandle&
- XELSE
- CURSOR cursor%(Cur%) :' Display normal B/W cursor
- END IF
- XELSE
- CURSOR cursor%(Cur%) :' No Color, display normal B/W cursor
- END IF
- END IF
- cursor_Delay% = cursor_Delay% + 1 :' Inc+ our internal delay by 1
- END FN
-
-
- LONG FN ProgressBar(barT,barL,barB,barR,percentComplete&,totalPercent&,pattern%)
-
- ' This function builds and updates our own progress bar.
-
- LONG IF barT > barB OR barR < barL OR percentComplete& > totalPercent& OR percentComplete& < 0
- Err = 1: ' problem with the values being passed do not draw or overflow error will happen
- XELSE
- Err = 0: ' Values passed the test, we may now update the progress bar
- END IF
-
- LONG IF Err = 0
- COLOR 0 :' Set color to white
- LONG IF percentComplete& <= 1
- PEN ,,,,19
- BOX FILL barT-4,barL-4 TO barB+4,barR+4 :' Draw a white filled box
- END IF
- COLOR -1 :' Set color to black
- PEN ,,,,0
- BOX barT-2,barL-2 TO barB+2,barR+2 :' Draw a black outlined box
- Distance% = barB - barT
- XDraw# = Distance%/totalPercent&
- DrawTo% = (percentComplete& * XDraw#) + barT
- COLOR 2 :' Set color to green/black 2bit macs
- PEN ,,,,pattern%
- IF percentComplete& > 1 THEN BOX FILL barT,barL TO DrawTo%,barR
- COLOR -1
- END IF
- END FN
-
-
- LONG FN RTRIM$(temp$)
-
- ' Strip trailing blanks CHR$(32)'s and low control characters from a string variable
- ' Modified to strip any character with an ASC value less than 32
-
- DO
- a% = ASC(RIGHT$(temp$,1))
- IF a% <= 32 THEN temp$=LEFT$(temp$,LEN(temp$)-1)
- UNTIL a% > 32 OR LEN(temp$) <= 1
-
- IF temp$ = " " THEN temp$ = ""
-
- END FN = temp$
-
-
- LONG FN LTRIM$(temp$)
-
- ' Strip leading blanks CHR$(32)'s and low control characters from a string variable
- ' Modified to strip any character with an ASC value less than 32
-
- DO
- a% = ASC(LEFT$(temp$,1))
- IF a% <= 32 THEN temp$ = RIGHT$(temp$,LEN(temp$)-1)
- UNTIL a% > 32 OR LEN(temp$) <= 1
-
- IF temp$ = " " THEN temp$ = ""
-
- END FN = temp$
-
-
- "Program_Start"
-
- ' Determine system environment we will be working with
- OSErr% = FN SYSENVIRONS(1,VARPTR(EnvVersion))
-
- fproc& = 0
- dID% = 4000
- whereY = 50
- whereX = 80
- numTypes = 1
- customDialogStyle% = 0
- prompt$ = ""
- fltrTp0& = CVI("TEXT")
-
- ' Setup and call our own custom SFPGET dialog box
- CALL SFPGETFILE(whereY,prompt$,0,numTypes,fltrTp0&,dlogHook&,SFGoodrCopy,dID%,fproc&)
-
- ' Append " new" to the end of the file we selected to reformat
- nName2$ = SFfName$ + " new"
-
- LONG IF LEN(SFfName$) > 0 AND SFGoodrCopy <> 0 :' Make sure we got a good file name
-
- tm& = TIMER :' Get time so we can monitor seconds later
- TEXT 0,12,0,0 :' Define TEXT as System Chicago 12
- bWnd% = 105 :' Bottom pixel location of window
- IF showLine% <> 0 THEN bWnd% = bWnd% + 40 :' Add 40 pixels if you will show data in window
- WINDOW 8,"ZCode Format",(10,40)-(285,bWnd%),261 :' Open the Window
-
- H& = FN GETRESOURCE(CVI("acur"),128) :' Get handle to our acur resource
- LONG IF FN RESERROR = 0 AND H& > 0 :' If a acur resource was found
- BLOCKMOVE PEEK LONG(H&),VARPTR(cursor%(0)),2
- x% = (cursor%(0) * 4) + 4 :' Check to see that we don't excede
- IF x% > 46 THEN x% = 50 :' our limit of up to 23 cursors per
- BLOCKMOVE PEEK LONG(H&),VARPTR(cursor%(0)),x% :' animation sequence + 2 control locations
- XELSE :' acur resource was not found, build our own
- x% = 140 :' build our own acur being with cur 140
- cursor%(1) = 7 :' Lets make the animation frames 7 long
- cursor%(0) = 2 :' set 2 calls per frame displayed
- FOR j% = 2 TO 18 STEP 2
- cursor%(j%) = x%
- x% = x% + 1
- NEXT j%
- END IF
- IF H& > 0 THEN CALL RELEASERESOURCE(H&) :' Release handle to acur resource
- Cur% = 2
-
- OPEN "I",1,SFfName$,,SFvRefNum :' Open original file
- OPEN "O",2,nName2$,,SFvRefNum :' Open our new reformated file
-
- addTab% = 0
- TabCnt% = 1 :' Default to 1 leading Tab
- break% = 0
- removeLine% = 0
-
- fileBytes& = LOF(1,1)
- processedBytes& = 0
- FN ProgressBar(22,28,241,36,100,100,19) :' Draw empty progress bar
-
-
- ON ERROR GOSUB 65535 :' Set error to our control for speed
-
- ON DIALOG GOSUB "Dialog"
- DIALOG ON
- DO :' Do until there is no more data in file
- DIALOG OFF
-
- LONG IF FN OptionDown
- break% = -1 :' Holding down Option key will break
- END IF :' terminate to program
- :' Update progress bar
- FN ProgressBar(22,28,241,36,processedBytes&,fileBytes&,3)
- FN CursorSpin :' Animate cursor
-
- LINE INPUT #1,a$ :' Get a line of data from original file
- processedBytes& = processedBytes& + LEN(a$) + 1 :' Count bytes for progress bar
- lineCount% = lineCount% + 1 :' Keep track of lines processed
-
- a$ = FN LTRIM$(a$) :' Remove all leading controls and spaces
- a$ = FN RTRIM$(a$) :' Remove all trailing controls and spaces
- addTab% = 0
-
- ' Determine if line should be tab'ed IN or tab'ed OUT
- IF LEFT$(a$,2) = "DO" THEN addTab% = 1:GOTO "break_Point"
- IF LEFT$(a$,5) = "WHILE" THEN addTab% = 1:GOTO "break_Point"
- IF LEFT$(a$,2) = "IF" THEN addTab% = 1:GOTO "break_Point"
- IF LEFT$(a$,6) = "SELECT" THEN addTab% = 2:GOTO "break_Point"
-
- ' CASE statements have to handled in a special way to maintain tabing levels
- LONG IF LEFT$(a$,4) = "CASE"
- addTab% = 1
- TabCnt% = TabCnt% - 1
- GOTO "break_Point"
- END IF
-
- IF LEFT$(a$,7) = "LONG FN" THEN addTab% = 1:GOTO "break_Point"
- IF LEFT$(a$,3) = "FOR" THEN addTab% = 1:GOTO "break_Point"
- IF LEFT$(a$,7) = "LONG IF" THEN addTab% = 1:GOTO "break_Point"
-
- IF LEFT$(a$,5) = "XELSE" THEN addTab% = 1:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,5) = "UNTIL" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,4) = "LOOP" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,4) = "WEND" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,6) = "END IF" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,10) = "END SELECT" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,6) = "END FN" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
- IF LEFT$(a$,4) = "NEXT" THEN addTab% = 0:TabCnt% = TabCnt% - 1:GOTO "break_Point2"
-
- "break_Point"
- ' Break Point label so you we can jump here by-passing other checks that are not needed
- ' This is bad, never, ever do a GOTO, except here it is OK. The above could be done with
- ' the CASE statements to avoid the GOTO
-
- IF LEFT$(a$,2) = "DO" AND INSTR(1,a$,"UNTIL") > 2 THEN addTab% = 0
- IF LEFT$(a$,2) = "IF" AND INSTR(1,a$,"THEN ") > 2 THEN addTab% = 0
- IF LEFT$(a$,3) = "FOR" AND INSTR(1,a$,"NEXT") > 3 THEN addTab% = 0
- IF LEFT$(a$,5) = "WHILE" AND INSTR(1,a$,"UNTIL") > 5 THEN addTab% = 0
-
- "break_Point2"
- ' Break Point2 label so you we can jump here by-passing other checks that are not needed
- ' This is bad, never, ever do a GOTO, except here it is OK. The above could be done with
- ' the CASE statements to avoid the GOTO
-
- ' We have to deal with an END SELECT in a special way to maintain tabing levels
- LONG IF LEFT$(a$,10) = "END SELECT"
- TabCnt% = TabCnt% - 1
- END IF
-
- ' Just a check to make sure we don't Zero or Negative Tab somewhere in the Twilight Zone
- IF TabCnt% < 1 THEN TabCnt% = 1
-
- ' Check to see if we should filter FULL line REMARK statements
- ' We will filter the following
- ' any line that starts with a '
- ' any line that starts with the word REM
- ' any line that starts with a :'
- LONG IF remDelete% <> 0
- IF LEFT$(a$,1) = "'" OR LEFT$(a$,3) = "REM" OR LEFT$(a$,2) = ":'" THEN removeLine% = 1 ELSE removeLine% = 0
- END IF
-
- ' If REM line NOT found then lets write the line back out to reformatted file
- LONG IF removeLine% = 0
- title% = 0
- IF ASC(LEFT$(a$,1)) = 34 OR LEFT$(a$,7) = "SEGMENT" THEN title% = 1 ELSE title% = 0 :' Check for a line label
- LONG IF title% = 0
- FOR j% = 1 TO TabCnt%
- PRINT #2,CHR$(9); :' Insert the appropiate number of TAB's
- NEXT j%
- PRINT #2, a$ :' Print the line to reformatted file
- XELSE
- PRINT #2,a$ :' Print label line to reformatted file
- addTab% = 0
- END IF
- IF addTab% > 0 THEN TabCnt% = TabCnt% + addTab% :' Update # of Tabs
- addTab% = 0
- END IF
-
- ' Check to see if we need to show the line just processed
- LONG IF showLine% <> 0
- T=65:L=5:B=94:R=280
- CALL TEXTBOX(VARPTR(a$)+1,LEN(a$),T,0)
- END IF
-
- ' Check to see if we need to show the current # of lines processed along with time
- LONG IF showLineCnt% <> 0
- T=43:L=105:B=57:R=293
- temp$ = STR$(lineCount%) + " " +STR$(TIMER-tm&)+" secs "
- CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
- END IF
-
- ' Check the like and make a special note if it is a CASE statement line, used above
- IF LEFT$(a$,4) = "CASE" THEN lastcas% = 1 ELSE lastcas% = 0
-
- UNTIL EOF(1) OR break% = -1
-
- FN ProgressBar(22,28,241,36,100,100,0) :' Draw progress bar at 100% complete
- FN CursorShow(Arrow) :' Set Cursor to standard ARROW
- FN ProgressBar(22,28,241,36,100,100,19) :' Reset progress bar (EMPTY)
-
- CLOSE #1 :' Close our original file
- CLOSE #2 :' Close our remormatted file
- WINDOW CLOSE #8 :' Close working Window
- IF ResRef > 0 THEN CALL CLOSERESFILE(ResRef) :' Release our handle to our appl resources
- END IF
- ON ERROR RETURN :' Return Error control to ZBASIC
- END :' Terminate program
-
-
- "Dialog"
-
- ' Check for event passed to our application
- d% = DIALOG(0)
- d1% = DIALOG(d%)
-
- LONG IF d% = 5
- GOSUB "Format_wnd" :' We an a window refresh request, lets do it
- END IF
-
- RETURN
-
-
- "Format_wnd"
-
- ' ReDraw poritions of window that were erased or hidden now that we
- ' are back on TOP.
-
- T=6:L=22:B=20:R=293
- temp$ = "File: "
- CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
-
- temp$ = SFfName$
- T=6:L=62:B=20:R=293
- CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
-
- LONG IF showLineCnt% <> 0
- T=43:L=22:B=57:R=293
- temp$ = "Line Count:"
- CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
-
- T=43:L=105:B=57:R=293
- temp$ = STR$(lineCount%) + " " +STR$(TIMER-tm&)+" secs "
- CALL TEXTBOX(VARPTR(temp$)+1,LEN(temp$),T,0)
- END IF
-
- RETURN
-
-
-
- "Dialog_Hook"
-
- ' This routine is from
-
- ' Ariel Publishing Inc.
- ' P.O. Box 398
- ' Pateros, WA 98846-0398
- ' (509) 923-2249
- ' Inside Basic (Journal of Macintosh BASIC programming)
- ' Volume 1, No.6 Pages 13-19
-
- ' This is the entry point for the hook.
-
- MACHLG &2039,&0000,&0A78 :' MOVE.L $A78,D0
- MACHLG &23CD,&0000,&0A78 :' MOVE.L A5,$A78
- MACHLG &2A40 :' MOVEA.L D0,A5
- MACHLG &2039,&0000,&0A7C :' MOVE.L $A7C,D0
- MACHLG &23CE,&0000,&0A7C :' MOVE.L A6,$A7C
- MACHLG &2C40 :' MOVEA.L D0,A6
-
- returnAddr& = PEEK LONG(REGISTER(A7)) :' Get the return address from the stack
- REGISTER(A7) = REGISTER(A7) + 4 :' Adjust the stack pointer
- theDialogPtr& = PEEK LONG(REGISTER(A7)) :' Get the first parameter (the dialog
- :' pointer) from the stack.
- REGISTER(A7) = REGISTER(A7) + 4 :' Adjust the stack pointer
- theItem = PEEK WORD(REGISTER(A7)) :' Get the item number from the stack
- REGISTER(A7) = REGISTER(A7) + 2 :' Adjust the stack pointer
- :'
- :' Now push all registers on to the stack
- :' so that we can put everything back
- :' like it was when we exit.
- :'
- MACHLG &48E7,&FFFC :' MOVEM.L D0-D7/A0-A5,-(SP)
-
- :' This is the real routine
-
-
- ' This is return action for dialog hook
- ' Monitor and toggle check boxes
- SELECT theItem
- CASE 11,12,13
- CALL GETDITEM(theDialogPtr&,theItem,theType,theHndl&,T)
- LONG IF FN GETCTLVALUE(theHndl&) = 0
- CALL SETCTLVALUE(theHndl&,1)
- XELSE
- CALL SETCTLVALUE(theHndl&,0)
- END IF
- theItem = 100
- CASE ELSE
- END SELECT
-
- LONG IF theItem = 14
- GOSUB "About" :' Wow, we got someone to click on the about icon, lets brag
- theItem = 100
- END IF
-
-
- LONG IF theItem = 1
-
- ' Get final settings we got a select from the user...
- CALL GETDITEM(theDialogPtr&,11,theType,theHndl&,T)
- showLine% = FN GETCTLVALUE(theHndl&) :' Should we show lines as they are processed?
-
- CALL GETDITEM(theDialogPtr&,12,theType,theHndl&,T)
- showLineCnt% = FN GETCTLVALUE(theHndl&) :' Should we show # of lines processed and time?
-
- CALL GETDITEM(theDialogPtr&,13,theType,theHndl&,T)
- remDelete% = FN GETCTLVALUE(theHndl&) :' Should we delete full REM lines?
-
- END IF
-
- :' Having completed this routine we
- :' need to put things back where we
- :' found them. First we restore the
- :' registers.
- :'
- MACHLG &4CDF,&3FFF :' MOVEM.L (SP)+,D0-D7/A0-A5
- REGISTER(D1) = theItem :' Push the return address back on the stack
- MACHLG &3E81 :' MOVE.W D1,(SP)
- REGISTER(D1) = returnAddr& :' Push the return address back on top
- :' Do the appScratch shuffle.
- MACHLG &2F01 :' MOVE.L D1,-(SP)
- MACHLG &2039,&0000,&0A78 :' MOVE.L $A78,D0
- MACHLG &23CD,&0000,&0A78 :' MOVE.L A5,$A78
- MACHLG &2A40 :' MOVEA.L D0,A5
- MACHLG &2039,&0000,&0A7C :' MOVE.L $A7C,D0
- MACHLG &23CE,&0000,&0A7C :' MOVE.L A6,$A7C
- MACHLG &2C40 :' MOVEA.L D0,A6
-
- ' This is one HELL of a USEFULL, GREAT, FANTASTIC routine - Thanks Ariel Publishing
-
- RETURN
-
-
- "About"
-
- FN CursorShow(Arrow)
-
- ' Get the handle to our about dialog and display it
- x& = FN GETNEWDIALOG(1000,0,-1)
- CALL MODALDIALOG(0,x%)
- FN CursorShow(Arrow)
- CALL DISPOSDIALOG(x&)
-
- RETURN
-
-
-
-
-